package com.doctracker.service;

import com.doctracker.model.Person;
import com.doctracker.model.ScanResult;

import java.io.File;
import java.util.List;
import java.util.Arrays;

/**
 * 文件扫描服务类
 * 负责扫描指定文件夹，匹配人员姓名
 */
public class FileScanner {
    
    /**
     * 支持的文件扩展名
     */
    private static final String[] SUPPORTED_EXTENSIONS = {
        // 文档类
        ".doc", ".docx", ".pdf", ".txt", ".rtf",
        // 演示文稿类
        ".ppt", ".pptx", ".pps", ".ppsx",
        // 表格类
        ".xls", ".xlsx", ".csv",
        // 图片类
        ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg",
        // 视频类
        ".mp4", ".avi", ".mov", ".wmv", ".mkv", ".flv", ".webm", ".m4v",
        // 音频类
        ".mp3", ".wav", ".flac", ".aac", ".wma", ".ogg",
        // 压缩包类
        ".zip", ".rar", ".7z", ".tar", ".gz", ".bz2",
        // 代码类
        ".java", ".py", ".cpp", ".c", ".h", ".js", ".html", ".css", ".php",
        // 其他常见格式
        ".json", ".xml", ".md", ".log"
    };
    
    /**
     * 扫描多个文件夹
     * 
     * @param folders 文件夹路径列表
     * @param people 人员列表
     * @return 扫描结果
     */
    public ScanResult scanFolders(List<String> folders, List<Person> people) {
        System.out.println("开始扫描 " + folders.size() + " 个文件夹");
        
        // 创建扫描结果对象
        ScanResult result = new ScanResult();
        result.setPeople(people);
        result.setFolders(folders);
        
        // 重置所有人员的提交状态
        resetPeopleStatus(people);
        
        int totalFileCount = 0;
        
        // 遍历每个文件夹进行扫描
        for (int i = 0; i < folders.size(); i++) {
            String folder = folders.get(i);
            System.out.println("正在扫描文件夹 (" + (i + 1) + "/" + folders.size() + "): " + folder);
            
            int folderFileCount = scanSingleFolder(folder, people);
            totalFileCount += folderFileCount;
            
            System.out.println("文件夹 " + folder + " 扫描完成，找到 " + folderFileCount + " 个文件");
        }
        
        // 更新统计信息
        result.setTotalFileCount(totalFileCount);
        result.updateStatistics();
        
        System.out.println("扫描完成！总计扫描 " + totalFileCount + " 个文件");
        System.out.println("匹配结果: " + result.getSubmittedCount() + " 人已提交，" + 
                          result.getUnsubmittedCount() + " 人未提交");
        
        return result;
    }
    
    /**
     * 扫描单个文件夹
     * 
     * @param folderPath 文件夹路径
     * @param people 人员列表
     * @return 该文件夹中的文件数量
     */
    private int scanSingleFolder(String folderPath, List<Person> people) {
        File folder = new File(folderPath);
        
        // 验证文件夹是否存在
        if (!folder.exists() || !folder.isDirectory()) {
            System.err.println("文件夹不存在或不是有效目录: " + folderPath);
            return 0;
        }
        
        // 获取文件夹中的所有文件
        File[] files = folder.listFiles();
        if (files == null) {
            System.err.println("无法读取文件夹内容: " + folderPath);
            return 0;
        }
        
        int fileCount = 0;
        
        // 遍历文件夹中的每个文件
        for (File file : files) {
            // 只处理文件，跳过子目录
            if (file.isFile() && isSupportedFile(file)) {
                fileCount++;
                
                // 尝试匹配人员姓名
                matchFileToPersons(file, people, folderPath);
            }
        }
        
        return fileCount;
    }
    
    /**
     * 尝试将文件匹配到人员
     * 支持重复文件处理：优先选择最新的文件
     * 
     * @param file 文件对象
     * @param people 人员列表
     * @param folderPath 文件夹路径
     */
    private void matchFileToPersons(File file, List<Person> people, String folderPath) {
        String fileName = file.getName();
        String folderName = getFolderNameFromPath(folderPath);
        System.out.println("检查文件: " + fileName + " (来源: " + folderName + ")");
        
        // 遍历所有人员，尝试匹配
        for (Person person : people) {
            if (isNameMatch(fileName, person.getName())) {
                
                // 如果该人员还没有找到匹配的文件，直接匹配
                if (!person.isHasSubmitted()) {
                    updatePersonWithFile(person, file, fileName, folderPath);
                    System.out.println("✅ 匹配成功: " + person.getName() + " -> " + fileName + " (" + folderName + ")");
                    break;
                } else {
                    // 如果已经有文件，比较修改时间，选择最新的
                    File existingFile = new File(person.getFilePath());
                    if (file.lastModified() > existingFile.lastModified()) {
                        updatePersonWithFile(person, file, fileName, folderPath);
                        System.out.println("🔄 更新文件: " + person.getName() + " -> " + fileName + " (" + folderName + ") [更新]");
                        break;
                    } else {
                        System.out.println("⚠️ 发现重复文件: " + person.getName() + " -> " + fileName + " (" + folderName + ") [保留原文件]");
                        break;
                    }
                }
            }
        }
    }
    
    /**
     * 更新人员文件信息
     * 
     * @param person 人员对象
     * @param file 文件对象
     * @param fileName 文件名
     * @param folderPath 文件夹路径
     */
    private void updatePersonWithFile(Person person, File file, String fileName, String folderPath) {
        person.setHasSubmitted(true);
        person.setFileName(fileName);
        person.setFolderPath(folderPath);
        person.setFilePath(file.getAbsolutePath());
    }
    
    /**
     * 从文件夹路径中提取文件夹名称
     * 
     * @param folderPath 文件夹完整路径
     * @return 文件夹名称
     */
    private String getFolderNameFromPath(String folderPath) {
        if (folderPath == null || folderPath.isEmpty()) {
            return "未知文件夹";
        }
        
        String[] parts = folderPath.replace("\\", "/").split("/");
        return parts.length > 0 ? parts[parts.length - 1] : "未知文件夹";
    }
    
    /**
     * 检查文件名是否匹配人员姓名
     * 
     * @param fileName 文件名
     * @param personName 人员姓名
     * @return 是否匹配
     */
    private boolean isNameMatch(String fileName, String personName) {
        // 将文件名和姓名都转换为小写进行比较
        String lowerFileName = fileName.toLowerCase();
        String lowerPersonName = personName.toLowerCase();
        
        // 简单的包含匹配
        return lowerFileName.contains(lowerPersonName);
    }
    
    /**
     * 检查文件是否为支持的格式
     * 
     * @param file 文件对象
     * @return 是否为支持的文件格式
     */
    private boolean isSupportedFile(File file) {
        String fileName = file.getName().toLowerCase();
        
        // 检查文件扩展名
        return Arrays.stream(SUPPORTED_EXTENSIONS)
                .anyMatch(fileName::endsWith);
    }
    
    /**
     * 重置所有人员的提交状态
     * 用于重新扫描时清空之前的结果
     * 
     * @param people 人员列表
     */
    private void resetPeopleStatus(List<Person> people) {
        System.out.println("重置人员提交状态");
        
        for (Person person : people) {
            person.resetSubmissionStatus();
        }
    }
    
    /**
     * 获取支持的文件扩展名列表
     * 
     * @return 支持的文件扩展名数组
     */
    public String[] getSupportedExtensions() {
        return SUPPORTED_EXTENSIONS.clone();
    }
    
    /**
     * 获取支持的文件扩展名描述文本
     * 
     * @return 扩展名描述文本
     */
    public String getSupportedExtensionsText() {
        return "支持的文件格式: " + String.join(", ", SUPPORTED_EXTENSIONS);
    }
} 